/**
 *  Base64인코딩/디코딩 방식을 이용한 데이터를 암호화/복호화하는 Business Interface class
 */
package com.hshh.common;

import java.lang.reflect.Array;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;

public class CommonUtil {
	static int pageStartNumBase = 1;
	public static int pageEndNumBase = 10;

    public static HashMap<String, Object> pageListSizeCheck(HashMap<String, Object> paramMap) {
    	String size = (String) paramMap.get("pageListSize");
    	Integer pageListSize = pageEndNumBase;
    	if(size!=null) pageListSize = Integer.parseInt(size);
    	paramMap.put("pageListSizeDefult", pageListSize);
    	paramMap.put("pageListSize", pageListSize);

		return paramMap;
    }

    /**
     * lang이 포함된 locale의 Locale ID를 담는다.
     * @param lang
     * @param langs
     * @return
     */
    public static List<String> localeMatchesLangList(String lang, List<String> langs){
		//returns array of all locales
        Locale[] localeList = SimpleDateFormat.getAvailableLocales();

        if(langs==null) {
        	langs = new ArrayList<String>();
        }

    	for (Locale locale : localeList) {
    		if(locale.toString().matches(".*"+lang+".*")){
            	langs.add("_" + locale.toString());
    		}
    	}
    	return langs;
	}
    /**
     * 값이 있는지 없는지 체크
     * obj == null or obj == '' 인경우 false
     * obj != null or obj != '' 인경우 true
     *
     * @param String data 암호화할 비밀번호
     * @return String result 암호화된 비밀번호
     * @exception Exception     *
     */
    @SuppressWarnings("rawtypes")
	public static boolean isEmpty(Object obj){
        if( obj instanceof String ) return obj==null || "".equals(obj.toString().trim());
        else if( obj instanceof List ) return obj==null || ((List)obj).isEmpty();
        else if( obj instanceof Map ) return obj==null || ((Map)obj).isEmpty();
        else if( obj instanceof Object[] ) return obj==null || Array.getLength(obj)==0;
        else return obj==null;
    }

    public static boolean isNotEmpty(Object s){
        return !isEmpty(s);
    }

    /**
     * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용)
     *
     * @param String data 암호화할 비밀번호
     * @return String result 암호화된 비밀번호
     * @exception Exception
     */
    public static String encryptPassword(String data) throws Exception {
		if (data == null) {
		    return "";
		}

		byte[] plainText = null; // 평문
		byte[] hashValue = null; // 해쉬값
		plainText = data.getBytes();

		MessageDigest md = MessageDigest.getInstance("SHA-256");
		hashValue = md.digest(plainText);

		/*
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(hashValue);
		*/
		return new String(Base64.encodeBase64(hashValue));
    }

    /**
     * 비밀번호를 암호화하는 기능(복호화가 되면 안되므로 SHA-256 인코딩 방식 적용)
     * @param data 암호화할 비밀번호
     * @param salt Salt
     * @return 암호화된 비밀번호
     * @throws Exception
     */
    public static String encryptPassword(String data, byte[] salt) throws Exception {

		if (data == null) {
		    return "";
		}

		byte[] hashValue = null; // 해쉬값

		MessageDigest md = MessageDigest.getInstance("SHA-256");

		md.reset();
		md.update(salt);
		hashValue = md.digest(data.getBytes());

		return new String(Base64.encodeBase64(hashValue));
    }

    /**
     * 비밀번호를 암호화된 패스워드 검증(salt가 사용된 경우만 적용).
     *
     * @param data 원 패스워드
     * @param encoded 해쉬처리된 패스워드(Base64 인코딩)
     * @return
     * @throws Exception
     */
    public static boolean checkPassword(String data, String encoded, byte[] salt) throws Exception {
    	byte[] hashValue = null; // 해쉬값

    	MessageDigest md = MessageDigest.getInstance("SHA-256");

    	md.reset();
    	md.update(salt);
    	hashValue = md.digest(data.getBytes());

    	return MessageDigest.isEqual(hashValue, Base64.decodeBase64(encoded.getBytes()));
    }
}